home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / objtools / makeoct.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  4KB  |  149 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /* 
  18.  *    makeoct -
  19.  *        Make an octant of a sphere.
  20.  *
  21.  *            Paul Haeberli - 1990
  22.  */
  23. #include "stdio.h"
  24. #include "sgiobj.h"
  25. #include "vect.h"
  26.  
  27. sgiobj *makeoct();
  28.  
  29. main(argc,argv)
  30. int argc;
  31. char **argv;
  32. {
  33.     int depth;
  34.     sgiobj *obj;
  35.  
  36.     if(argc<3) {
  37.      fprintf(stderr,"usage: makeoct outfile depth\n");
  38.      exit(1);
  39.     }
  40.     depth = atoi(argv[2]);
  41.     obj = makeoct(8,depth); 
  42.     writesgiobj(argv[1],obj);
  43. }
  44.  
  45. static float odata[6][3] = {
  46.     {1, 0, 0},
  47.     {-1, 0, 0},
  48.     {0, 1, 0},
  49.     {0, -1, 0},
  50.     {0, 0, 1},
  51.     {0, 0, -1}
  52. };
  53.  
  54. static long ondex[8][3] = {
  55.     {4, 3, 0}, {4, 1, 3},
  56.     {4, 2, 1}, {4, 0, 2},
  57.  
  58.     {5, 2, 0}, {1, 2, 5}, 
  59.     {5, 0, 3}, {1, 5, 3}
  60. };
  61.  
  62. sgiobj *makeoct(sides,depth)
  63. int sides,depth;
  64. {
  65.     int s, i, j, k, n, ntris;
  66.     float *v0, *v1, *v2;
  67.     float w[4][3];
  68.     float t[4][3];
  69.     float t0[3], t1[3],t2[3];
  70.     float *fptr;
  71.     sgiobj *obj;
  72.  
  73.     if(sides>8)
  74.     sides = 8;
  75.     ntris = sides*depth*depth;
  76.     obj = (sgiobj *)newtriobj(ntris);
  77.     fptr = (float *)obj->data;
  78.  
  79.     for(s=0; s<sides; s++) {
  80.     v0 = odata[ondex[s][0]];
  81.     v1 = odata[ondex[s][1]];
  82.     v2 = odata[ondex[s][2]];
  83.     vset(t0,0.0,0.0,0.0);
  84.     vset(t1,1.0,0.0,0.0);
  85.     vset(t2,0.5,1.0,0.0);
  86.     for(i=0; i<depth; i++) {
  87.         for (j = 0; (i + j)<depth; j++) { /* do one piece of row */
  88.         k = depth-i-j;
  89.         for(n=0; n<3; n++) {
  90.             w[0][n] = (i+0)*v0[n] + (j+0)*v1[n] + (k+0)*v2[n];
  91.             w[1][n] = (i+1)*v0[n] + (j+0)*v1[n] + (k-1)*v2[n];
  92.             w[2][n] = (i+0)*v0[n] + (j+1)*v1[n] + (k-1)*v2[n];
  93.             w[3][n] = (i+1)*v0[n] + (j+1)*v1[n] + (k-2)*v2[n];
  94.  
  95.             t[0][n] = ((i+0)*t0[n] + (j+0)*t1[n] + (k+0)*t2[n])/depth;
  96.             t[1][n] = ((i+1)*t0[n] + (j+0)*t1[n] + (k-1)*t2[n])/depth;
  97.             t[2][n] = ((i+0)*t0[n] + (j+1)*t1[n] + (k-1)*t2[n])/depth;
  98.             t[3][n] = ((i+1)*t0[n] + (j+1)*t1[n] + (k-2)*t2[n])/depth;
  99.         }
  100.         for(n=0; n<4; n++) 
  101.             vnormal(w[n]);
  102.         puttri(fptr,w[0],w[1],w[2],t[0],t[1],t[2]);
  103.         fptr += 3*PNTLONGS;
  104.         if((k-2)>=0) {
  105.             puttri(fptr,w[3],w[2],w[1],t[3],t[2],t[1]);
  106.             fptr += 3*PNTLONGS;
  107.         }
  108.         }
  109.     } 
  110.     }
  111.     return obj;
  112. }
  113.  
  114. puttri(fptr,p0,p1,p2,t0,t1,t2)
  115. float *fptr;
  116. vect *p0, *p1, *p2;
  117. vect *t0, *t1, *t2;
  118. {
  119.     *fptr++ = p0->x;    /* normal */
  120.     *fptr++ = p0->y;
  121.     *fptr++ = p0->z;
  122.     *fptr++ = t0->x;    /* texture */
  123.     *fptr++ = t0->y;
  124.     *fptr++ = t0->z;
  125.     *fptr++ = p0->x/2.0;/* position */
  126.     *fptr++ = p0->y/2.0;
  127.     *fptr++ = p0->z/2.0;
  128.  
  129.     *fptr++ = p1->x;    /* normal */
  130.     *fptr++ = p1->y;
  131.     *fptr++ = p1->z;
  132.     *fptr++ = t1->x;    /* texture */
  133.     *fptr++ = t1->y;
  134.     *fptr++ = t1->z;
  135.     *fptr++ = p1->x/2.0;/* position */
  136.     *fptr++ = p1->y/2.0;
  137.     *fptr++ = p1->z/2.0;
  138.  
  139.     *fptr++ = p2->x;    /* normal */
  140.     *fptr++ = p2->y;
  141.     *fptr++ = p2->z;
  142.     *fptr++ = t2->x;    /* texture */
  143.     *fptr++ = t2->y;
  144.     *fptr++ = t2->z;
  145.     *fptr++ = p2->x/2.0;/* position */
  146.     *fptr++ = p2->y/2.0;
  147.     *fptr++ = p2->z/2.0;
  148. }
  149.